package studio7i.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import studio7i.excepcion.DAOExcepcion;
import studio7i.modelo.Instrumento;
import studio7i.modelo.Reserva;
import studio7i.modelo.Sala;
import studio7i.modelo.Servicio;
import studio7i.modelo.Usuario;
import studio7i.negocio.SalaNegocio;
import studio7i.negocio.UsuarioNegocio;
import studio7i.util.ConexionBD;

public class ReservaDAO extends BaseDAO {
	
	public void actualizar(Reserva oReserva) throws DAOExcepcion {
		System.out.println("ReservaDAO: actualizar(Reserva oReserva)");
		
		String query ="";		
		query +="UPDATE RESERVA SET FECHARESERVA=?,COSTO=?,";
		query +="HORAINICIO=?,HORAFIN=? ";
		query +="WHERE IDRESERVA=?";
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setDate(1,oReserva.getFechaReserva());
			stmt.setDouble(2,oReserva.getCosto());
			stmt.setInt(3,oReserva.getHoraInicio());
			stmt.setInt(4,oReserva.getHoraFin());
			stmt.setInt(5,oReserva.getIdReserva());

			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Reserva insertar(Reserva re) throws DAOExcepcion {
		
		String query = "INSERT INTO reserva (idReserva,idSala,idUsuario,costo,idDescuento) VALUES (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			con.setAutoCommit(false);
			stmt = con.prepareStatement(query);
			stmt.setInt(1,re.getIdReserva());
			stmt.setInt(2,re.getSala().getIdSala());
			stmt.setInt(3,re.getUsuario().getIdUsuario());
			stmt.setDouble(4,re.getCosto());
			stmt.setInt(5,re.getDescuento().getIdDescuento());
			

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}

			int idp = 0;
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				idp = rs.getInt(1);
			}
			re.setIdReserva(idp);

			con.commit();
		} catch (SQLException e) {
			try {
				con.rollback();
			} catch (SQLException e1) {
				throw new DAOExcepcion(e.getMessage());
			}
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			try {
				con.setAutoCommit(true);
			} catch (SQLException e) {
				throw new DAOExcepcion(e.getMessage());
			}
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return re;
	}

	public Collection<Reserva> consultar(Date fechaInicio,Date fechaFin,int idSala) throws DAOExcepcion {
		Collection<Reserva> lista = new ArrayList<Reserva>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT IDRESERVA,IDSALA,IDUSUARIO,COSTO,FECHARESERVA,HORAINICIO,HORAFIN FROM RESERVA";
			query +=" WHERE IDSALA=?";
			query +=" and FECHARESERVA>=?";
			query +=" and FECHARESERVA<=?";

			stmt = con.prepareStatement(query);
			
			stmt.setInt(1,idSala);
			stmt.setDate(2,fechaInicio);
			stmt.setDate(3,fechaFin);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Reserva re = new Reserva();
				
				Sala sala = new Sala();
				SalaNegocio saNe = new SalaNegocio();
				sala=saNe.getSala(rs.getInt("IDSALA"));
				Usuario usuario = new Usuario();
				UsuarioNegocio usNe =new UsuarioNegocio();
				usuario=usNe.getUsuario(rs.getInt("IDUSUARIO"));
				
				re.setSala(sala);
				re.setUsuario(usuario);
				
				Collection<Instrumento> in = new ArrayList<Instrumento>();
				in=this.consultarInstrumentos(rs.getInt("IDRESERVA"));
				re.setInstrumentos(in);
				Collection<Servicio> se = new ArrayList<Servicio>();
				se=this.consultarServicios(rs.getInt("IDRESERVA"));
				re.setServicios(se);
				
				re.setIdReserva(rs.getInt("IDRESERVA"));
				re.setCosto(rs.getDouble("COSTO"));
				re.setFechaReserva(rs.getDate("FECHARESERVA"));
				re.setHoraInicio(rs.getInt("HORAINICIO"));
				re.setHoraFin(rs.getInt("HORAFIN"));
				lista.add(re);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Instrumento> consultarInstrumentos(int idReserva) throws DAOExcepcion {
		Collection<Instrumento> lista = new ArrayList<Instrumento>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT instrumento.* FROM reserva";
			query +=" inner join instrumento_reserva ON reserva.idreserva=instrumento_reserva.idreserva";
			query +=" inner join instrumento ON instrumento_reserva.idinstrumento=instrumento.idinstrumento";
			query +=" where reserva.idreserva=?";

			stmt = con.prepareStatement(query);
			
			stmt.setInt(1,idReserva);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Instrumento in = new Instrumento();				
				in.setIdInstrumento(rs.getInt("idInstrumento"));
				in.setNombre(rs.getString("nombre"));
				in.setModelo(rs.getString("modelo"));
				in.setCaracteristicas(rs.getString("caracteristicas"));
				in.setPrecio(rs.getDouble("precio"));
				lista.add(in);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Servicio> consultarServicios(int idReserva) throws DAOExcepcion {
		Collection<Servicio> lista = new ArrayList<Servicio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();

			String query = "SELECT servicio.* FROM reserva";
			query +=" inner join servicio_reserva ON reserva.idreserva=servicio_reserva.idreserva";
			query +=" inner join servicio ON servicio_reserva.idservicio=servicio.idservicio";
			query +=" where reserva.idreserva=?";

			stmt = con.prepareStatement(query);
			
			stmt.setInt(1,idReserva);
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Servicio se = new Servicio();
				se.setIdServicio(rs.getInt("IdServicio"));
				se.setNombre(rs.getString("nombre"));
				se.setCaracteristicas(rs.getString("caracteristicas"));
				se.setPrecio(rs.getDouble("precio"));
				lista.add(se);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

}
	
	

